package leecode

import "math"

func findShortestSubArray(nums []int) (result int) {
	result = math.MaxInt64
	//先求出原数组的度
	numsCount := getMap(nums)
	// 记录数字出现的次数
	count := make(map[int]int)
	//滑动窗口 , 寻找子数组相同的度
	left := 0
	for right := 0; right+1 <= len(nums); right++ {
		// 更新数字出现的次数
		count[nums[right]]++
		//出现的次数等于原数组度数
		for count[nums[right]] == numsCount {
			result = min(result, right-left+1)
			//符合要求的话,窗口一直右移
			// 移动左指针
			count[nums[left]]--
			left++
		}
	}
	return
}

// 求数组的度
func getMap(nums []int) (count int) {
	hashMap := make(map[int]int) //key为数组中的元素 , value为出现的次数
	for i := 0; i < len(nums); i++ {
		hashMap[nums[i]]++
		count = max(count, hashMap[nums[i]])
	}
	return
}
